home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmigaPlus / Tools / Development / AmigaTalk / general / Pen.st < prev    next >
Text File  |  2004-01-31  |  7KB  |  247 lines

  1. "-------------------------------------------------------------"
  2. "  the following use the primitives interfacing to the plot(3)"
  3. "  routines.                                                  "
  4. "           pen - a simple drawing instrument                 "
  5. "-------------------------------------------------------------"
  6.  
  7. Class Pen :Object
  8. ! title x y angle width height fpen bpen !
  9. [
  10.    movePlotEnvBy: deltaPoint
  11.       <primitive 169 2 title (deltaPoint x) (deltaPoint y)>.
  12.       ^ self
  13. |
  14.    setLineType: bitPattern
  15.       <primitive 179 bitPattern>.
  16.       ^ self
  17. |
  18.    drawText: text at: aPoint
  19.       <primitive 178 text (aPoint x) (aPoint y) fpen bpen>.
  20.       x <- (aPoint x).
  21.       y <- (aPoint y).
  22.       ^ self
  23. |
  24.    drawBox: fromPoint to: toPoint
  25.       <primitive 175 (fromPoint x) (fromPoint y) (toPoint x) (toPoint y)>.
  26.       x <- (toPoint x).
  27.       y <- (toPoint y).
  28.       ^ self
  29. |
  30.    drawCircleAt: aPoint radius: r
  31.       <primitive 174 (aPoint x) (aPoint y) r>.
  32.       x <- (aPoint x).
  33.       y <- (aPoint y).        "Leave us at the center of the circle."
  34.       ^ self
  35. |
  36.    circleRadius: rad         "Draw a circle centered at current location."
  37.       <primitive 174 x y rad>.
  38.       ^ self
  39. |
  40.    drawArcAround: pivotPoint for: angleSize
  41.       " angleSize is expressed in Radians. "
  42.       (angleSize isKindOf: Radian)
  43.          ifTrue: [ <primitive 168 x y (angleSize asFloat) (pivotPoint x) (pivotPoint y) > ].
  44.          
  45.       ^ self
  46. |
  47.    drawArcAt: startPoint around: pivotPoint for: angleSize
  48.       " angleSize is expressed in Radians. "
  49.       (angleSize isKindOf: Radian)
  50.          ifTrue: [<primitive 168 (startPoint x) (startPoint y)
  51.                                  (angleSize asFloat) (pivotPoint x) (pivotPoint y) > ].
  52.       ^ self
  53. |
  54.    drawTo: aPoint
  55.       <primitive 172 (aPoint x) (aPoint y)>.
  56.       x <- (aPoint x).
  57.       y <- (aPoint y).
  58.       ^ self
  59. |
  60.    goTo: aPoint
  61.       <primitive 171 (aPoint x) (aPoint y)>.
  62.       x <- aPoint x.
  63.       y <- aPoint y.
  64.       ^ self
  65. |
  66.    drawLine: fromPoint to: toPoint
  67.       <primitive 177 (fromPoint x) (fromPoint y) (toPoint x) (toPoint y)>.
  68.       x <- (toPoint x).
  69.       y <- (toPoint y).
  70.       ^ self
  71. |
  72.    drawPoint: aPoint
  73.       <primitive 173 (aPoint x) (aPoint y)>.
  74.       x <- (aPoint x).
  75.       y <- (aPoint y).
  76.       ^ self
  77. |
  78.    direction             "Which way are we going?" 
  79.       ^ angle
  80. |
  81.    direction: radians    "Set the direction to go."
  82.       angle <- radians.
  83.       ^ self
  84. |
  85.    erase                 "Blank out the Current PlotEnv Window."
  86.       <primitive 170>.
  87.       ^ self
  88. |
  89.    extent                "Tell User how large the Plot area is."
  90.       ^ width @ height
  91. |
  92.    location              "Tell User where the pen is."
  93.       ^ x @ y
  94. |
  95.    titleIs
  96.       ^ title
  97. |
  98.    center                "goTo the center of the Plot region."
  99.       self goTo: (width / 2) @ (height / 2).
  100.       ^ self
  101. |
  102.    tellPens              "Tell User which pens are being used."
  103.       ^ fpen @ bpen.
  104.       ^ self
  105. |
  106.    setPens: penSet       "penSet is of Class Point (front @ back)."
  107.       <primitive 176 (penSet x) (penSet y)>.
  108.       fpen <- (penSet x).
  109.       bpen <- (penSet y).
  110.       ^ self
  111. |
  112.    go: anAmount ! newx newy !
  113.       (angle isKindOf: Radian)
  114.         ifTrue:  [newx <- ((angle sin) * anAmount) rounded + x.
  115.                   newy <- ((angle cos) * anAmount) rounded + y
  116.                  ]
  117.         ifFalse: [newx <- (((angle radians) sin) * anAmount) rounded + x.
  118.                   newy <- (((angle radians) cos) * anAmount) rounded + y
  119.                  ].
  120.  
  121.       self drawTo: newx @ newy.  "go: leaves drawn pixels as it moves."
  122.       ^ self
  123. |
  124.    turn: addedRadians
  125.       angle <- angle + addedRadians.
  126.       ^ self
  127. |
  128.    new
  129.       title  <- 'Unknown Plot'. 
  130.       angle  <- Radian new: 0.
  131.       x      <- 160.
  132.       y      <- 100.
  133.       width  <- 320.
  134.       height <- 200.
  135.       fpen   <- 1.
  136.       bpen   <- 0.
  137.       ^ self
  138. |
  139.    new: newPlotTitle            "We want a unique Plot Title!"
  140.       (newPlotTitle isKindOf: String)
  141.          ifTrue:  [ title <- newPlotTitle  ]
  142.          ifFalse: [ title <- 'Unknown Plot'].
  143.  
  144.       angle  <- Radian new: 0.
  145.       x      <- 160.
  146.       y      <- 100.
  147.       width  <- 320.
  148.       height <- 200.
  149.       fpen   <- 1.
  150.       bpen   <- 0.
  151.       ^ self
  152. |
  153.    openPlotEnv: sizePoint ! nx ny !
  154.       nx <- sizePoint x.
  155.       ny <- sizePoint y.
  156.        
  157.       (<primitive 169 1 title nx ny> == true)
  158.          ifFalse:  [ self error: 'openPlotEnv ', title, ' did NOT open!'. 
  159.                      ^ nil
  160.                    ]
  161.          ifTrue:   [ angle  <- Radian new: 0.
  162.                      x      <- (nx / 2).
  163.                      y      <- (ny / 2).
  164.                      width  <- nx.
  165.                      height <- ny.
  166.                      ^ self
  167.                    ]
  168. |
  169.    closePlotEnv: whichPlotTitle
  170.       (<primitive 169 0 whichPlotTitle> == true)
  171.         ifFalse: [self error: 'PlotEnv ',whichPlotTitle,' did NOT close!'.
  172.                   ^ self
  173.                  ].
  174.       ^ nil
  175. ]
  176.  
  177. "----------------------------------------------------"
  178. " FormPen - a collection of lines                    "
  179. " I don't think this class will work as written (JTS)"
  180. "----------------------------------------------------"
  181.  
  182. Class FormPen :Pen
  183. ! lines !
  184. [
  185.    new
  186.       lines <- Bag new
  187. |
  188.    add: startingPoint to: endingPoint "Methinks this is broken:"
  189.       lines add: ( Point new ; x: startingPoint ; y: endingPoint ).
  190.       ^ self
  191. |
  192.    with: aPen displayAt: location ! xOffset yOffset sPoint ePoint !
  193.       xOffset <- (location x).
  194.       yOffset <- (location y).
  195.  
  196.       lines do: [:pair |
  197.  
  198.          sPoint <- (pair x).
  199.          ePoint <- (pair y).
  200.  
  201.          aPen   goTo: (sPoint x + xOffset) @ (sPoint y + yOffset).
  202.          aPen drawTo: (ePoint x + xOffset) @ (ePoint y + yOffset).
  203.          ].
  204.  
  205.       ^ self
  206. ]
  207.  
  208. "----------------------------------------------------"
  209. " SavePen - a way to save the drawings made by a pen "
  210. "----------------------------------------------------"
  211.  
  212. Class SavePen :FormPen
  213. ! saveForm !
  214. [
  215.    setForm: aForm
  216.       saveForm <- aForm.
  217.       ^ self
  218. |
  219.    goTo: aPoint
  220.       super    goTo: aPoint.
  221.       saveForm  add: (self location) to: aPoint.
  222.       super    goTo: aPoint.
  223.       ^ self
  224. ]
  225.  
  226. "-----------------------------------------------------"
  227. " ShowPen - show off some of the capabilities of pens."
  228. "-----------------------------------------------------"
  229.  
  230. Class ShowPen :Object
  231. ! bic !
  232. [
  233.    withPen: aPen "aPen has to be init'd & open before using these methods."
  234.       bic <- aPen.
  235.       ^ self
  236. |
  237.    poly: nSides length: length
  238.       nSides timesRepeat:  [ bic   go: length.
  239.                              bic turn: (6.2831853 / nSides)  "2 PI"
  240.                            ].
  241.       ^ self
  242. |
  243.    spiral: n angle: a
  244.       (1 to: n) do: [:i | bic go: i. bic turn: a].
  245.       ^ self
  246. ]
  247.